import type { KnowledgeDetail } from '@/types/knowledge';

/**
 * 数据操作知识点数据
 */
export const dmlKnowledge: KnowledgeDetail[] = [
	{
		id: 1,
		title: 'INSERT插入数据',
		description: 'INSERT语句用于向表中插入新数据，可以插入单条或多条记录。',
		icon: '➕',
		categoryId: 'sql-dml',
		categoryName: '数据操作',
		categoryIcon: '✏️',
		difficulty: '入门',
		color: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
		headerBg: 'linear-gradient(135deg, #2c3e50 0%, #34495e 100%)',
		tagBg: 'linear-gradient(135deg, #3498db 0%, #2980b9 100%)',
		tagColor: '#ffffff',
		difficultyBg: 'linear-gradient(135deg, #2ecc71 0%, #27ae60 100%)',
		keyPoints: [
			{
				point: '基本语法：INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...)。',
				code: `-- 插入单条记录（指定列）
INSERT INTO users (name, email, age) 
VALUES ('John Doe', 'john@example.com', 25);

-- 插入单条记录（所有列）
INSERT INTO users 
VALUES (1, 'John Doe', 'john@example.com', 25, '2024-01-15');

-- 插入多条记录
INSERT INTO users (name, email, age) 
VALUES 
    ('Alice', 'alice@example.com', 28),
    ('Bob', 'bob@example.com', 30),
    ('Charlie', 'charlie@example.com', 22);`
			},
			{
				point: '使用SELECT插入：可以从其他表查询数据并插入到目标表。',
				code: `-- 从查询结果插入
INSERT INTO users_backup (name, email, age)
SELECT name, email, age 
FROM users 
WHERE age > 25;

-- 插入计算值
INSERT INTO orders (user_id, total_amount, order_date)
SELECT 
    user_id,
    SUM(price * quantity) AS total,
    CURRENT_DATE
FROM order_items
GROUP BY user_id;`
			},
			{
				point: '处理NULL值：如果列允许NULL，可以不指定该列或使用NULL关键字。',
				code: `-- 允许NULL的列可以不指定
INSERT INTO users (name, email) 
VALUES ('John', 'john@example.com');
-- age列如果是NULL，将使用默认值或NULL

-- 显式插入NULL
INSERT INTO users (name, email, age) 
VALUES ('John', 'john@example.com', NULL);

-- 使用DEFAULT关键字
INSERT INTO users (name, email, age) 
VALUES ('John', 'john@example.com', DEFAULT);`
			},
			{
				point: '批量插入的性能优化：一次性插入多条记录比多次插入单条记录效率更高。',
				code: `-- ❌ 低效：多次单条插入
INSERT INTO users (name, email) VALUES ('User1', 'user1@example.com');
INSERT INTO users (name, email) VALUES ('User2', 'user2@example.com');
INSERT INTO users (name, email) VALUES ('User3', 'user3@example.com');

-- ✅ 高效：批量插入
INSERT INTO users (name, email) 
VALUES 
    ('User1', 'user1@example.com'),
    ('User2', 'user2@example.com'),
    ('User3', 'user3@example.com');`
			},
			{
				point: 'INSERT IGNORE和ON DUPLICATE KEY UPDATE：处理插入冲突的情况（MySQL）。',
				code: `-- INSERT IGNORE：如果主键冲突，忽略插入
INSERT IGNORE INTO users (id, name, email) 
VALUES (1, 'John', 'john@example.com');

-- ON DUPLICATE KEY UPDATE：如果主键冲突，更新记录
INSERT INTO users (id, name, email) 
VALUES (1, 'John Updated', 'john@example.com')
ON DUPLICATE KEY UPDATE 
    name = VALUES(name),
    email = VALUES(email);`
			}
		]
	},
	{
		id: 2,
		title: 'UPDATE更新数据',
		description: 'UPDATE语句用于修改表中的现有数据，可以更新单条或多条记录。',
		icon: '🔄',
		categoryId: 'sql-dml',
		categoryName: '数据操作',
		categoryIcon: '✏️',
		difficulty: '入门',
		color: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
		headerBg: 'linear-gradient(135deg, #2c3e50 0%, #34495e 100%)',
		tagBg: 'linear-gradient(135deg, #3498db 0%, #2980b9 100%)',
		tagColor: '#ffffff',
		difficultyBg: 'linear-gradient(135deg, #2ecc71 0%, #27ae60 100%)',
		keyPoints: [
			{
				point: '基本语法：UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition。',
				code: `-- 更新单条记录
UPDATE users 
SET email = 'newemail@example.com', age = 26
WHERE id = 1;

-- 更新多条记录
UPDATE products 
SET price = price * 0.9  -- 打9折
WHERE category_id = 5;

-- 更新所有记录（谨慎使用）
UPDATE users 
SET last_login = CURRENT_TIMESTAMP;`
			},
			{
				point: 'WHERE子句的重要性：UPDATE语句必须使用WHERE子句，否则会更新所有记录。',
				code: `-- ✅ 正确：使用WHERE条件
UPDATE users SET status = 'active' WHERE id = 1;

-- ⚠️ 危险：没有WHERE条件，会更新所有记录
UPDATE users SET status = 'active';  -- 更新所有用户！

-- 安全做法：先查询，再更新
SELECT * FROM users WHERE id = 1;  -- 先确认
UPDATE users SET status = 'active' WHERE id = 1;`
			},
			{
				point: '使用表达式更新：可以在SET子句中使用算术表达式和函数。',
				code: `-- 使用算术表达式
UPDATE products 
SET price = price * 1.1,  -- 涨价10%
    stock = stock - 10     -- 库存减10
WHERE id = 1;

-- 使用函数
UPDATE users 
SET 
    name = UPPER(name),
    updated_at = CURRENT_TIMESTAMP
WHERE id = 1;

-- 使用子查询
UPDATE orders 
SET total_amount = (
    SELECT SUM(price * quantity) 
    FROM order_items 
    WHERE order_id = orders.id
);`
			},
			{
				point: '多表更新：某些数据库支持在UPDATE中使用JOIN更新多个表。',
				code: `-- MySQL多表更新
UPDATE users u
JOIN user_profiles p ON u.id = p.user_id
SET 
    u.email = 'newemail@example.com',
    p.bio = 'Updated bio'
WHERE u.id = 1;

-- SQL Server多表更新
UPDATE u
SET u.email = 'newemail@example.com'
FROM users u
INNER JOIN user_profiles p ON u.id = p.user_id
WHERE u.id = 1;`
			},
			{
				point: 'UPDATE的限制和注意事项：注意事务、锁和性能影响。',
				code: `-- 在事务中执行更新
BEGIN;
UPDATE users SET status = 'active' WHERE id = 1;
UPDATE orders SET status = 'completed' WHERE user_id = 1;
COMMIT;

-- 使用LIMIT限制更新数量（MySQL）
UPDATE users 
SET last_login = CURRENT_TIMESTAMP
WHERE last_login IS NULL
LIMIT 100;  -- 只更新100条

-- 注意：更新大量数据时，可能锁表影响性能`
			}
		]
	},
	{
		id: 3,
		title: 'DELETE删除数据',
		description: 'DELETE语句用于从表中删除数据，可以删除单条或多条记录。',
		icon: '🗑️',
		categoryId: 'sql-dml',
		categoryName: '数据操作',
		categoryIcon: '✏️',
		difficulty: '入门',
		color: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
		headerBg: 'linear-gradient(135deg, #2c3e50 0%, #34495e 100%)',
		tagBg: 'linear-gradient(135deg, #3498db 0%, #2980b9 100%)',
		tagColor: '#ffffff',
		difficultyBg: 'linear-gradient(135deg, #2ecc71 0%, #27ae60 100%)',
		keyPoints: [
			{
				point: '基本语法：DELETE FROM table_name WHERE condition。WHERE子句用于指定要删除的记录。',
				code: `-- 删除单条记录
DELETE FROM users WHERE id = 1;

-- 删除多条记录
DELETE FROM orders 
WHERE order_date < '2023-01-01';

-- ⚠️ 危险：删除所有记录（没有WHERE条件）
DELETE FROM users;  -- 删除所有用户！

-- 更安全的做法：先查询确认
SELECT * FROM users WHERE id = 1;  -- 先查看
DELETE FROM users WHERE id = 1;     -- 再删除`
			},
			{
				point: 'DELETE vs TRUNCATE：DELETE逐行删除，TRUNCATE删除所有数据并重置表。',
				code: `-- DELETE：逐行删除，可以回滚，会触发触发器
DELETE FROM users;  -- 删除所有记录，但保留表结构

-- TRUNCATE：快速删除所有数据，重置自增ID，不能回滚
TRUNCATE TABLE users;  -- 更快，但不可回滚

-- 区别：
-- DELETE可以带WHERE条件，TRUNCATE不可以
-- DELETE较慢但安全，TRUNCATE很快但不安全
-- DELETE可以被事务回滚，TRUNCATE不可以`
			},
			{
				point: '使用LIMIT限制删除数量：可以限制一次删除的记录数。',
				code: `-- MySQL：使用LIMIT
DELETE FROM logs 
WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY)
LIMIT 1000;  -- 只删除1000条旧日志

-- 分批删除大量数据
WHILE (SELECT COUNT(*) FROM logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY)) > 0
DO
    DELETE FROM logs 
    WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY)
    LIMIT 1000;
END WHILE;`
			},
			{
				point: '多表删除：某些数据库支持在DELETE中使用JOIN删除多个表的记录。',
				code: `-- MySQL多表删除
DELETE u, p 
FROM users u
JOIN user_profiles p ON u.id = p.user_id
WHERE u.status = 'inactive';

-- 只删除主表，但条件涉及关联表
DELETE u 
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.total_amount = 0;`
			},
			{
				point: '级联删除：通过外键约束自动删除相关记录。',
				code: `-- 创建表时设置级联删除
CREATE TABLE orders (
    id INT PRIMARY KEY,
    user_id INT,
    FOREIGN KEY (user_id) REFERENCES users(id) 
        ON DELETE CASCADE  -- 删除用户时，自动删除其订单
);

-- 删除用户时，相关订单自动删除
DELETE FROM users WHERE id = 1;  -- 自动删除user_id=1的所有订单

-- 注意：级联删除要谨慎使用，可能导致意外删除大量数据`
			}
		]
	},
	{
		id: 4,
		title: 'TRUNCATE清空表',
		description: 'TRUNCATE用于快速删除表中的所有数据，比DELETE更快但不可回滚。',
		icon: '🧹',
		categoryId: 'sql-dml',
		categoryName: '数据操作',
		categoryIcon: '✏️',
		difficulty: '入门',
		color: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
		headerBg: 'linear-gradient(135deg, #2c3e50 0%, #34495e 100%)',
		tagBg: 'linear-gradient(135deg, #3498db 0%, #2980b9 100%)',
		tagColor: '#ffffff',
		difficultyBg: 'linear-gradient(135deg, #2ecc71 0%, #27ae60 100%)',
		keyPoints: [
			{
				point: '基本语法：TRUNCATE TABLE table_name。删除所有数据并重置自增ID。',
				code: `-- 清空表数据
TRUNCATE TABLE users;
TRUNCATE TABLE orders;
TRUNCATE TABLE products;

-- 效果：删除所有数据，但保留表结构
-- 自增ID会重置为初始值（通常是1）
-- 比DELETE FROM table快得多`
			},
			{
				point: 'TRUNCATE的特点：速度快、不可回滚、不触发触发器、重置自增ID。',
				code: `-- TRUNCATE的特点：
-- 1. 速度非常快（DROP TABLE + CREATE TABLE）
-- 2. 不可回滚（即使使用事务）
-- 3. 不触发DELETE触发器
-- 4. 重置AUTO_INCREMENT计数器
-- 5. 不能带WHERE条件

-- 示例
TRUNCATE TABLE logs;  -- 快速清空日志表`
			},
			{
				point: 'TRUNCATE的限制：不能用于有外键引用的表，除非先删除外键约束。',
				code: `-- ❌ 错误：表被外键引用时不能TRUNCATE
TRUNCATE TABLE users;  
-- Error: Cannot truncate a table referenced in a foreign key constraint

-- ✅ 正确做法1：先删除外键约束
ALTER TABLE orders DROP FOREIGN KEY fk_user;
TRUNCATE TABLE users;
ALTER TABLE orders ADD FOREIGN KEY (user_id) REFERENCES users(id);

-- ✅ 正确做法2：使用DELETE（较慢但安全）
DELETE FROM users;`
			},
			{
				point: 'TRUNCATE vs DELETE：选择合适的方法取决于场景。',
				code: `-- 场景对比：

-- 需要快速清空表，不需要条件筛选
TRUNCATE TABLE temp_table;  -- ✅ 推荐

-- 需要删除部分数据，需要事务回滚
DELETE FROM users WHERE status = 'inactive';  -- ✅ 推荐

-- 需要保留自增ID的连续性
DELETE FROM users;  -- ✅ 推荐（TRUNCATE会重置ID）

-- 需要触发删除触发器
DELETE FROM users;  -- ✅ 推荐（TRUNCATE不触发）`
			},
			{
				point: 'TRUNCATE的安全使用：生产环境应谨慎使用，建议先备份数据。',
				code: `-- 生产环境使用TRUNCATE的标准流程

-- 1. 备份数据
CREATE TABLE users_backup AS SELECT * FROM users;

-- 2. 确认备份成功
SELECT COUNT(*) FROM users_backup;

-- 3. 执行TRUNCATE
TRUNCATE TABLE users;

-- 4. 验证结果
SELECT COUNT(*) FROM users;  -- 应该返回0

-- ⚠️ 注意：TRUNCATE无法回滚，操作前必须确认！`
			}
		]
	}
];

